package model

//
//  Template
//  @Description: 增删改查model模板，两步写完增删改查model，1.搜索 Template、temp
// late 2.替换成你的 Model、model
//
import (
	"errors"
	"leeframe/internal/pkg/logger"
	"leeframe/internal/pkg/mysql"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type Template struct {
	Id int `gorm:"column:id"`
}

type Pagination struct {
	Page int `json:"page" form:"page" binding:"required"` // 页码 从1开始
	Size int `json:"size" form:"size" binding:"required"` // 单页数据量
}

// Insert
// @Author: xmc
// @Date: 2021-12-07 10:57:53
// @Description: 插入
func (m Template) Insert(ctx *gin.Context, tx *gorm.DB, template Template) (int, error) {
	result := tx.Create(&template)
	if result.Error != nil {
		return 0, result.Error
	}
	return template.Id, nil
}

// Delete
// @Author: xmc
// @Date: 2021-12-07 10:57:57
// @Description: 删除
func (m Template) Delete(ctx *gin.Context, where string, args ...interface{}) error {
	if err := mysql.GetDB().Where(where, args...).Delete(&Template{}).Error; err != nil {
		logger.ErrorN(ctx, err)
		return err
	}
	return nil
}

// Update
// @Author: xmc
// @Date: 2021-12-07 10:58:03
// @Description: 修改
func (m Template) Update(ctx *gin.Context, update map[string]interface{}, where string, args ...interface{}) error {
	result := mysql.GetDB().Model(&Template{}).Where(where, args...).Updates(update)
	if result.Error != nil {
		return result.Error
	}
	if result.RowsAffected == 0 {
		return errors.New("未更新")
	}
	return nil
}

// First
// @Author: xmc
// @Date: 2021-12-07 10:58:08
// @Description: 单条查找
func (m Template) First(ctx *gin.Context, where string, args ...interface{}) (Template, error) {
	var template Template
	if err := mysql.GetDB().Where(where, args...).First(&template).Error; err != nil {
		logger.ErrorN(ctx, err)
		return template, err
	}
	return template, nil
}

// Find
// @Author: xmc
// @Date: 2021-12-07 10:58:18
// @Description: 列表查找，不需要分页pagination赋值nil即可。
func (m Template) Find(ctx *gin.Context, pagination *Pagination, where string, args ...interface{}) ([]Template, int64, error) {
	var (
		template []Template
		total    int64
	)
	db := mysql.GetDB().Model(&Template{})
	if pagination != nil {
		offset := (pagination.Page - 1) * pagination.Size
		db = db.Offset(offset).Limit(pagination.Size)
	}
	db = db.Where(where, args...)
	if err := db.Count(&total).Error; err != nil {
		logger.ErrorN(ctx, err)
		return nil, 0, err
	}
	if err := db.Find(&template).Error; err != nil {
		logger.ErrorN(ctx, err)
		return template, 0, err
	}
	return template, total, nil
}
